import type { Component, VNode } from 'vue'

/**
 * 搜索组件列表配置
 * @label 描述
 * @prop 绑定字段
 * @type 组件类型
 * @defaultValue -- 默认值
 * @options 下拉选项
 * @span 空间分配权重
 * @heidden 默认是否显示
 * @itemAttrs 组件相关属性
 * @formItem 表单Item相关属性
 * @events 组件事件
 */
export interface SearchItemType {
  label: string;
  prop: string;
  type: "Input" | "Select" | "DatePicker" | "Cascader" | "Checkbox" | "Autocomplete" | "InputNumber" | "Radio" | "TreeSelect" | "DateTimePicker" | "DateRange" | "NumberRange";
  defaultValue?: any;
  options?: any[];
  span?: number;
  heidden?: boolean;
  itemAttrs?: any;
  formItem?: any;
  events?: any;
}

/**
 * @immediate 是否立刻执行查询 true
 * @heidden 是否显示查询条件 true
 */
export interface SearchOptionType {
  immediate?: boolean;
  heidden?: boolean
}

type Slots = { [name: string]: Slot }

type Slot = () => Children

type Children = string | number | boolean | VNode | null | Children[]

// h函数接口
type customH = (type: string | Component, props?: object | null, children?: Children | Slot | Slots) => VNode

/**
 * @label 按钮文字
 * @src 按钮图标地址
 * @handleName 点击事件名称
 * @option 按钮其他属性配置
 * @show 是否显示,接收一个 boolean 值或回调函数
 * @disabled 是否禁用,接收一个 boolean 值或回调函数
*/
export interface buttonType {
  id?: number | string;
  label: string;
  src?: string;
  handleName: string;
  option?: any;
  show?: boolean | (<T>(row: T) => boolean)
  disabled?: boolean | (<T>(row: T) => boolean)
}

/**
 * @label 表头名称
 * @prop 表头绑定字段
 * @heidden 初始化是否显示表头,默认 true
 * @column 表头属性配置，支持Element该组件所有属性
 * @slotName 插槽名称
 * @defineCustom 自定义表格内容，接收 h 函数，或自定格式数组
 * @children 多级表头
*/
export interface tableHeaderType {
  id?: string
  label: string;
  prop?: string;
  heidden?: boolean;
  column?: any;
  slotName?: string;
  defineCustom?: customH | string;
  children?: tableHeaderType[]
}

/**
 * @selection 是否显示多选
 * @selectionOption 多选配置，参考el-table
 * @index 是否显示索引
 * @hiddenSlot 是否显示插槽
 * @tableHeight 表格高度
 * @expand 展开行
 * @tableAttrs 表格绑定属性
 * @tableEvent 表格绑定事件
 */
export interface tableOptionType {
  selection?: boolean;
  selectionOption?: any;
  index?: boolean;
  hiddenSlot?: boolean;
  hiddenToolbar?: boolean;
  tableHeight?: number;
  expand?: boolean;
  tableAttrs?: any;
  tableEvent?: any
}

/**
 * @hidden 是否显示分页
 * @option 分页组件配置（参考element-plus）
*/
export interface paginationType {
  hidden?: boolean;
  option?: any
}